//
//  Status.swift
//  MyBlog
//
//  Created by lvtienan on 15/8/6.
//  Copyright © 2015年 ltn. All rights reserved.
//

import UIKit
import SDWebImage

/// 微博模型
class Status: NSObject {
    
    //微博创建时间
    var creat_at: String?
    // 微博 id
    var id: Int = 0
    //  微博的信息内容
    var text: String?
    // 微博来源
    var source: String?
    // 配图数组(字典数组)
    var pic_urls: [[String: AnyObject]]? {
        
        didSet {
            if pic_urls!.count == 0 {
                return
            }
            
            // 实例化数组
            storePictureURls = [NSURL] ()
            // 遍历字典生成 url数组
            for dict in pic_urls! {
                if let urlString = dict["thumbnail_pic"] as? String {
                    storePictureURls?.append(NSURL(string: urlString)!)
                }
            }
        }
    }
    
    //保存配图的 URL 数组
    private var storePictureURls: [NSURL]?
    // 配图 url 数组,计算型数组 
    // r如果是原创微博就返回原创微博的,如果是转发微博的,就返回转发微博的数组
    var pictureURLs: [NSURL]? {
        return retweeted_status == nil ? storePictureURls : retweeted_status?.storePictureURls
    }
    // 用户记录
    var user: User?
    // 转发微博
    var retweeted_status: Status?
    
    // 显示微博所需要的行高
    var rowHeight: CGFloat?
    
    /// 加载微博数据
    class func loadStatus(finished: (dataList: [Status]?, error: NSError?) -> ()){
        
        NetworkTools.sharedNetworkTools.loadStatus { (result, error) -> () in
            
            if error != nil {
                finished(dataList: nil, error: error)
                return
            }
            // result是可选字典,字典的 status 存储的是数组,数组里边的内容是字典
            // [[String: AnyObject]]里边的值是字典的数组
            if let array = result!["statuses"] as? [[String: AnyObject]] {
                var list = [Status]()
                
                for dict in array {
                    list.append(Status(dict: dict))
                }
                // 缓存图片
                self.cacheWebImage(list, finished:finished)
                // 获得完整的微博数据,可以回调
                //finished(dataList: list, error: nil)
            } else {
                finished(dataList: nil, error: nil)
            }
            
        }
    }
    
    // 缓存微博的网络图片
    private class func cacheWebImage(list:[Status], finished: (dataList: [Status]?, error: NSError?) -> ()) {
        // 缓存图片的大小
        //var dataLength = 0
        // 创建调度租
        let group = dispatch_group_create()
        // 循环变量数组
        for status in list {
            // 判断是否有图片
            guard let urls = status.pictureURLs else {
                // url 为空
                continue
            }
            
            // 遍历图片数组,缓存图片
            for imageUrl in urls {
                // 入组
                dispatch_group_enter(group)
                SDWebImageManager.sharedManager().downloadImageWithURL(imageUrl, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, _, _, _, _) -> Void in
                    //print(image)
                    //let data = UIImagePNGRepresentation(image)!
                    //dataLength += data.length
                    dispatch_group_leave(group)
                })
                
            }
        }
        // 监听所有缓存操作的通知
        dispatch_group_notify(group, dispatch_get_main_queue()) { 
            // 缓存结束,进行回调
            //print("缓存图片大小 \(dataLength / 1024) K")
            finished(dataList: list, error: nil)
        }
    }
    
    // MARK: - 构造函数
    init(dict: [String: AnyObject]) {
        super.init()
        
        // 给每一个属性赋值
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    override func setValue(value: AnyObject?, forKey key: String) {
        // 判断 key 是否是 user, 如果是 user 就单独处理
        if key == "user" {
            // 判断 value 是否是一个有效的字典
           if  let dict = value as? [String: AnyObject] {
                user = User(dict: dict)
            }
            
            return
        }
        
        // 判断 Key 是否是 retweeted_status
        // 转发微博最多只会执行一次
        if key == "retweeted_status" {
            if let dict = value as? [String: AnyObject] {
                retweeted_status = Status(dict: dict)
            }
            return
        }
        
        super.setValue(value, forKey: key)
    }
    
    override var description: String {
        let keys = ["creat_at", "id", "text", "source", "pic_urls", "user", "retweeted_status"]
        return "\(dictionaryWithValuesForKeys(keys))"
    }
    

}
